///////////////////////////////////////////////////////////////////
//   USB HASP 
// Copyright (c) 2004 Chingachguk & Denger2k All Rights Reserved
///////////////////////////////////////////////////////////////////
HASP USB    USB-,  
        :
1. Transfer Type=Control, Maximum Packet Size=8
2. Transfer Type=Interrupt, Maximum Packet Size<8
   1    .

///////////////////////////////////////////////////////////////////
//   
///////////////////////////////////////////////////////////////////
      :
1.  aksusb       
(SETUP token),   :
-   (request type) - vendor
-   - endpoint 0 (control)
-        -    
-    SETUP token  (bRequest, wValue, wIndex, wLenght)
       :
    typedef struct _KEY_REQUEST {
        UCHAR   majorFnCode;    //   - (  KEY_FN_LIST)
        USHORT  param1,         //   
                param2, param3;
    } KEY_REQUEST, *PKEY_REQUEST;

    //    
    enum KEY_FN_LIST {
        KEY_FN_SET_CHIPER_KEYS          = 0x80,
        KEY_FN_CHECK_PASS               = 0x81,
        KEY_FN_READ_3WORDS              = 0x82,
        KEY_FN_WRITE_WORD               = 0x83,
        KEY_FN_READ_ST                  = 0x84,
        KEY_FN_READ_NETMEMORY_3WORDS    = 0x8B,
        KEY_FN_HASH_DWORD               = 0x98
    };

2. ,    SETUP token,   
       .   
   :
    typedef struct _KEY_RESPONSE {
        UCHAR   status,             //    (  KEY_OPERATION_STATUS)
                encodedStatus;      // CRC  status   majorFnCode 
        UCHAR   data[16];           //   
    } KEY_RESPONSE, *PKEY_RESPONSE;
    
    //   
    enum KEY_OPERATION_STATUS {
        KEY_OPERATION_STATUS_OK                     = 0,
        KEY_OPERATION_STATUS_ERROR                  = 1,
        KEY_OPERATION_STATUS_INVALID_MEMORY_ADDRESS = 4,
        KEY_OPERATION_STATUS_LAST                   = 0x1F
    };
 ,       8 .  
   USB     ,
          .

      .    
       KEY_FN_SET_CHIPER_KEYS.  
      Key2     
KEY_RESPONSE::encodedStatus,      .

///////////////////////////////////////////////////////////////////
//  ,  
///////////////////////////////////////////////////////////////////
1.     (KEY_FN_SET_CHIPER_KEYS).
Key1      , Key2    
   0xA0CB.

:
keyRequest.majorFnCode=KEY_FN_SET_CHIPER_KEYS;
keyRequest.param1=Key1;

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 

    UCHAR   keyType1,           //  ,       0x02
            keyType2;           //  ,    0x0A - HASP, 0x1A - TimeHASP
    UCHAR   unknown;            // 0x00
    USHORT  productionSN;       //  ,        
} KEY_RESPONSE_0x80;
   KEY_RESPONSE_0x80 .

2.    (KEY_FN_CHECK_PASS).
        
   ,   KEY_FN_SET_CHIPER_KEYS.
    KEY_FN_CHECK_PASS.

:
keyRequest.majorFnCode=KEY_FN_CHECK_PASS;
keyRequest.param1=PasswordLow;
keyRequest.param2=PasswordHigh;
  keyRequest.param1, keyRequest.param2 .

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 

    USHORT  memorySuze;         //     
    UCHAR   unknown;            // 0x10
} KEY_RESPONSE_0x81;
   KEY_RESPONSE_0x81 .

3.     (KEY_FN_READ_3WORDS).
     3     .

:
keyRequest.majorFnCode=KEY_FN_READ_3WORDS;
keyRequest.param1=wordOffset;   //    
  keyRequest.param1 .

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 

    USHORT  memory[3];          //     ,    wordOffset
} KEY_RESPONSE_0x82;
   KEY_RESPONSE_0x82 .

4.     (KEY_FN_WRITE_WORD).
    1     .

:
keyRequest.majorFnCode=KEY_FN_WRITE_WORD;
keyRequest.param1=wordOffset;   // ,     
keyRequest.param2=data;         //  
  keyRequest.param1, keyRequest.param2 .

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 
} KEY_RESPONSE_0x83;
   KEY_RESPONSE_0x83 .

5.  Secret Table   (KEY_FN_READ_ST).
    8  Secret Table  .

:
keyRequest.majorFnCode=KEY_FN_READ_ST;

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 
    UCHAR   st[8];              // Secret table 
} KEY_RESPONSE_0x84;
   KEY_RESPONSE_0x84 .

6.    NetMemory   (KEY_FN_READ_NETMEMORY_3WORDS).
     3   NetMemory  .

:
keyRequest.majorFnCode=KEY_FN_READ_NETMEMORY_3WORDS;
keyRequest.param1=wordOffset;   //    
  keyRequest.param1 .

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 

    USHORT  netMemory[3];       //    NetMemory  ,    wordOffset
} KEY_RESPONSE_0x8B;
   KEY_RESPONSE_0x8B .
  NetMemory USB HASP-:

: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
  : 12 1A 12 0F 03 00 70 00 02 FF 00 00 FF FF FF FF

:
12 1A 12 0F - Serial number 
03 00 -   ?
70 00 -     
02 FF - ?
00 00 -      (00 00 - )
FF FF - ?
FF    -   (FF - , FE - Net, FD - Time)
FF - ?

7. MAC  DWORD (KEY_FN_HASH_DWORD).
    DWORD    (MAC).

:
keyRequest.majorFnCode=KEY_FN_HASH_DWORD;
keyRequest.param1=DWORDlow;     //  16   DWORD
keyRequest.param2=DWORDhigh;    //  16   DWORD
  keyRequest.param1, keyRequest.param2 .

:
typedef struct {
    UCHAR   status,             //    (  KEY_OPERATION_STATUS)
            encodedStatus;      // CRC  status   majorFnCode 

    ULONG   hashedDWORD;        //  DWORD
} KEY_RESPONSE_0x98;
   KEY_RESPONSE_0x98 .